package com.easy.tool.utils.ajax;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.easy.tool.anno.BeanDes;
import com.easy.tool.anno.MethodDes;
import com.easy.tool.constant.ResponseCode;
import com.easy.tool.enums.CommonEnum;
import com.easy.tool.enums.ResponseEnum;
import com.easy.tool.utils.enums.EnumUtils;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @author 高俊
 * @create 2021-09-2021/9/8-11:20
 */
@Data
@NoArgsConstructor
@BeanDes(name = "JsonResult返回类型", des = "用于controller返回类型")
@Deprecated
public class JsonResult<T> {

    private Integer code;

    private String codeName;

    private String msg;

    private T data;

    public JsonResult(Integer code, String codeName, String msg, T data) {
        this.code = code;
        this.codeName = codeName;
        this.msg = msg;
        this.data = data;
    }
    public JsonResult(Integer code, String codeName) {
        this.code = code;
        this.codeName = codeName;
    }
    public JsonResult(String msg) {
        this.msg = msg;
    }


    /**
     * 自定义请求结果
     * @param code 自定义请求吗
     * @param codeName 自定义名称
     * @param msg 自定义消息
     * @param data 自定义数据
     * @param <T>
     * @return
     */
    @MethodDes(des = "自定义请求结果",param = {"arg0-> code：自定义请求吗","arg1-> codeName：自定义名称","arg2-> msg：自定义消息","arg3-> data：自定义数据"})
    public static <T> JsonResult<T> customResult(Integer code,String codeName,String msg, T data){
        JsonResult<T> result = new JsonResult<>(code, codeName, msg, data);
        return result;
    }
    @MethodDes(des = "自定义请求结果",param = {"arg0-> code：响应码","arg1-> codeName：响应码名称"})
    public static <T> JsonResult<T> customResult(Integer code,String codeName){
        JsonResult<T> result = new JsonResult<>(code, codeName);
        return result;
    }

    /**
     * 返回 message
     * @param msg
     * @param <T>
     * @return
     */
    @MethodDes(des = "返回 message",param = {"arg0-> msg：消息"})
    public static <T> JsonResult<T> message(String msg){
        JsonResult<T> result = new JsonResult<>(msg);
        return result;
    }

    /**
     * 其他请求请求结果。只支持系统内定的请求吗有需要可以去ResponseEnum类中自定义
     * 携带msg和data参数
     * @param inCode
     * @param msg
     * @param data
     * @param <T>
     * @return
     */
    @MethodDes(des = "其他请求请求结果",
            explain = "只支持系统内定的请求吗有需要可以去ResponseEnum类中自定义",
            param = {"arg0-> inCode：内置请求码","arg1-> msg：消息","arg2-> data：数据"})
    public static <T> JsonResult<T> otherResult(Integer inCode,String msg, T data){
        JsonResult<T> result = otherResultSon(inCode, msg, data);
        return result;
    }

    /**
     * 其他请求请求结果。只支持系统内定的请求吗有需要可以去ResponseEnum类中自定义
     * 不携带msg和data参数
     * @param inCode 内置请求码
     * @param <T>
     * @return
     */
    @MethodDes(des = "其他请求请求结果",
            explain = "只支持系统内定的请求吗有需要可以去ResponseEnum类中自定义",
            param = {"arg0-> inCode：内置请求码"})
    public static <T> JsonResult<T> otherResult(Integer inCode){
        JsonResult<T> result = otherResultSon(inCode, null, null);
        return result;
    }

    /**
     * 封装的方法
     * @param inCode
     * @param msg
     * @param data
     * @param <T>
     * @return
     */
    private static <T> JsonResult<T> otherResultSon(Integer inCode,String msg, T data){
        Integer code = inCode;
        String codeName = "";

        String name = (String) EnumUtils.getCodeNameByCode(ResponseEnum.class, code);
        if (name != null){
            codeName = name;

            return new JsonResult<>(code, codeName, null, data);
        }else {
            // 默认请求码是不存在的
            code = CommonEnum.NO_FOUND_RESPONSE_CODE.getCode();
            codeName = CommonEnum.NO_FOUND_RESPONSE_CODE.getCodeName();

            return new JsonResult<>(code, codeName, null, data);
        }

    }


    /**
     * 请求成功
     * @param msg 消息
     * @param data 数据
     * @param <T>
     * @return
     */
    @MethodDes(des = "请求成功",param = {"arg0-> msg：消息","arg1-> data：数据"})
    public static <T> JsonResult<T> ok(String msg, T data){
        JsonResult<T> result = okSon(msg,data);
        return result;
    }

    /**
     * 请求成功 只需要msg
     * @param msg 消息
     * @param <T>
     * @return
     */
    @MethodDes(des = "请求成功 只需要msg",param = {"arg0-> msg：消息"})
    public static <T> JsonResult ok(String msg){
        JsonResult<Object> result = okSon(msg, null);
        return result;
    }

    /**
     * 请求成功 只需要data
     * @param <T>
     * @return
     */
    @MethodDes(des = "请求成功 只需要data",param = {"arg0-> data：数据"})
    public static <T> JsonResult<T> ok(T data){
        JsonResult<T> result = okSon(null, data);
        return result;
    }

    /**
     * 请求成功 不带任何参数调用
     * @param <T>
     * @return
     */
    @MethodDes(des = "请求成功 不带任何参数调用")
    public static <T> JsonResult<T> ok(){
        JsonResult<T> result = okSon(null,null);
        return result;
    }

    /**
     * 封装ok的公用方法
     * @param <T>
     * @return
     */
    private static <T> JsonResult<T> okSon(String msg,T data){
        Integer code = ResponseEnum.OK.getCode();
        String codeName = ResponseEnum.OK.getCodeName();
        JsonResult<T> result = new JsonResult<>(code, codeName, msg, data);
        return result;
    }



}
